#include <my_header.h>

// 全局变量，用于统计总目录数
static int dirs = 0;
static int files =0;

// 深度优先搜索打印目录树
// dirpath:要递归遍历的根目录
// width: 打印宽度，用于控制缩进，增强视觉层次感
void DFS_print(char *dirpath, int width)
{
    DIR *dirp = opendir(dirpath);
    ERROR_CHECK(dirp, NULL, "opendir");  // 检查目录是否成功打开

    struct dirent *pdirent;
    // 循环读取目录项
    while((pdirent = readdir(dirp)) != NULL)
    {
        // 跳过"."和".."这两个特殊目录
        if(strcmp(pdirent->d_name, ".") == 0 ||
            strcmp(pdirent->d_name, "..") == 0)
        {
            continue;
        }

        // 打印前缀和缩进，构建树形结构的视觉效果
        printf("└");
        for(int i=1; i<width; i++)
        {
            printf("─");
        }

        // 打印当前文件或目录的名称
        printf("%s\n", pdirent->d_name);
        // 如果是目录，递归调用自己，继续深度遍历
        // man 3 readdir查看DT_DIR
        if(pdirent->d_type == DT_DIR)
        {
            // DT_DIR表示目录文件
            dirs++;
            char path[1024] = {0};
            // 1.拼接绝对路径的实现方式
            // 构建递归调用的目录路径名
            sprintf(path, "%s%s%s", dirpath, "/", pdirent->d_name);
            DFS_print(path, width + 4);   // 递归调用，增加宽度以增加缩进
        }
        else{
            files++;    // 文件数++
        }
    }
    // 遍历完成，关闭目录
    closedir(dirp);
}


/* Usage: ./my_tree pathname*/
int main(int argc, char *argv[]){                                  
    ARGS_CHECK(argc, 2);
    // 打印根目录名称
    printf("%s\n", argv[1]);
    // 从根目录开始深度优先遍历打印目录树，初始打印4个
    DFS_print(argv[1], 4);
    printf("\n %d directories, %d files\n", dirs, files);
    return 0;
}


